/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.handler;

import java.sql.SQLException;
import java.util.LinkedList;
import model.dao.EspecieDAO;
import model.dto.EspecieDTO;
import model.exception.MissingIdException;
import model.exception.NoChangesOnUpdateException;
import model.exception.NotNullFieldsException;

/**
 *
 * @author Gabriel
 */
public class EspecieHandler {

    EspecieDAO especieDAO;

    public EspecieHandler() throws SQLException, ClassNotFoundException {
        especieDAO = new EspecieDAO();
    }

    private void verificaCamposNotNullInsercao(EspecieDTO especieDTO) throws NotNullFieldsException {
        if (especieDTO.getNomeCientifico() == null) {
            throw new NotNullFieldsException("A  é informação obrigatória em uma Espécie");
        }
        if (especieDTO.getNomeVulgar() == null) {
            throw new NotNullFieldsException("A  é informação obrigatória em uma Espécie");
        }
        if (especieDTO.getIdGrpEcoGeral() == null) {
            throw new NotNullFieldsException("A  é informação obrigatória em uma Espécie");
        }
        if (especieDTO.getIdGrpEcoEspec() == null) {
            throw new NotNullFieldsException("A  é informação obrigatória em uma Espécie");
        }
        if (especieDTO.getfLMes() == null) {
            throw new NotNullFieldsException("Informações de floração e frutificação no mês são obrigatórias em uma Espécie");
        }
        if (especieDTO.getIdNatureza() == null) {
            throw new NotNullFieldsException("A Natrueza é informação obrigatória em uma Espécie");
        }
        if (especieDTO.getfRMes() == null) {
            throw new NotNullFieldsException("Informações de floração e frutificação no mês são obrigatórias em uma Espécie");
        }
        if (especieDTO.getSementesKG() == null) {
            throw new NotNullFieldsException("A quantidade de sementes média por Kg  é informação obrigatória em uma Espécie");
        }
    }

    private void verificaCamposNotNullAtualizacao(EspecieDTO especieDTO, 
                                                  boolean atualizaNomeCientifico, 
                                                  boolean atualizaNomeVulgar, 
                                                  boolean atualizaGrpEcoGeral, 
                                                  boolean atualizaGrpEcoEspec, 
                                                  boolean atualizafLMes,
                                                  boolean atualizaSementesKG, 
                                                  boolean atualizafRMes, 
                                                  boolean atualizaNatureza) throws NotNullFieldsException {

        if ((especieDTO.getNomeCientifico() == null) && atualizaNomeCientifico) {
            throw new NotNullFieldsException("O Nome Científico  é informação obrigatória em uma Espécie");
        }
        if ((especieDTO.getNomeVulgar() == null) && atualizaNomeVulgar) {
            throw new NotNullFieldsException("O Nome Vulgar  é informação obrigatória em uma Espécie");
        }
        if ((especieDTO.getIdGrpEcoGeral() == null) && atualizaGrpEcoGeral) {
            throw new NotNullFieldsException("O Grupo Ecológico Geral é informação obrigatória em uma Espécie");
        }
        if ((especieDTO.getIdGrpEcoEspec() == null) && atualizaGrpEcoEspec) {
            throw new NotNullFieldsException("O Grupo Ecológico Específico  é informação obrigatória em uma Espécie");
        }
        if ((especieDTO.getfLMes() == null) && atualizafLMes) {
            throw new NotNullFieldsException("Informações de floração e frutificação no mês são obrigatórias em uma Espécie");
        }
        if ((especieDTO.getIdNatureza() == null) && atualizaNatureza) {
            throw new NotNullFieldsException("A Natureza é informação obrigatória em uma Espécie");
        }
        if ((especieDTO.getfRMes() == null) && atualizafRMes) {
            throw new NotNullFieldsException("Informações de floração e frutificação no mês são obrigatórias em uma Espécie");
        }
        if ((especieDTO.getSementesKG() == null) && atualizaSementesKG) {
            throw new NotNullFieldsException("A quantidade de sementes média por Kg  é informação obrigatória em uma Espécie");
        }
    }

    public LinkedList<EspecieDTO> pesquisaEspecie(Integer id, String nomeEspecie) throws SQLException {
        return especieDAO.pesquisaEspecie(id, nomeEspecie);

    }

    public void cadastraEspecie(EspecieDTO especieDTO) throws SQLException, NotNullFieldsException {
        verificaCamposNotNullInsercao(especieDTO);
        especieDAO.insereEspecie(especieDTO);
    }

    public void atualizaEspecie(EspecieDTO especieDTO,
            Boolean atualizaNomecientifico,
            Boolean atualizaProcedencia,
            Boolean atualizaNomevulgar,
            Boolean atualizaFamilia,
            Boolean atualizaGrpecogeral,
            Boolean atualizaGrpecoespec,
            Boolean atualizaDiammincopa,
            Boolean atualizaDiammaxcopa,
            Boolean atualizaFustemin,
            Boolean atualizaFustemax,
            Boolean atualizaAlturamin,
            Boolean atualizaAlturamax,
            Boolean atualizaDesenvolvimento,
            Boolean atualizaCicloproducao,
            Boolean atualizaFlcor,
            Boolean atualizaFlMes,
            Boolean atualizaTipofruto,
            Boolean atualizaNatureza,
            Boolean atualizaFrcor,
            Boolean atualizaFrMes,
            Boolean atualizaTiposemeadura,
            Boolean atualizaSementeskg,
            Boolean atualizaArmazensemente,
            Boolean atualizaTmpgerminmin,
            Boolean atualizaTmpgerminmax,
            Boolean atualizaPercentgermin,
            Boolean atualizaViabilsemente) throws SQLException, NotNullFieldsException, NoChangesOnUpdateException, MissingIdException {

        // Verifica se o identificador foi passado
        if (especieDTO.getId() == null) {
            throw new MissingIdException();
        }

        verificaCamposNotNullAtualizacao(especieDTO, atualizaNomecientifico, atualizaNomevulgar, atualizaGrpecogeral, atualizaGrpecoespec, atualizaFrMes, atualizaSementeskg, atualizaFrMes, atualizaNatureza);

        /* Verifica se existe atualização */
        if (!(atualizaNomecientifico || atualizaProcedencia || atualizaNomevulgar || atualizaFamilia || atualizaGrpecogeral || atualizaGrpecoespec || atualizaDiammincopa || atualizaDiammaxcopa || atualizaFustemin || atualizaFustemax || atualizaAlturamin || atualizaAlturamax || atualizaDesenvolvimento || atualizaCicloproducao || atualizaFlcor || atualizaFlMes || atualizaFrMes|| atualizaTipofruto || atualizaNatureza || atualizaFrcor || atualizaTiposemeadura || atualizaSementeskg || atualizaArmazensemente || atualizaTmpgerminmin || atualizaTmpgerminmax || atualizaPercentgermin || atualizaViabilsemente)) {
            throw new NoChangesOnUpdateException();
        }

        especieDAO.atualizaEspecie(especieDTO, atualizaNomecientifico, atualizaProcedencia, atualizaNomevulgar, atualizaFamilia, atualizaGrpecogeral, atualizaGrpecoespec, atualizaDiammincopa, atualizaDiammaxcopa, atualizaFustemin, atualizaFustemax, atualizaAlturamin, atualizaAlturamax, atualizaDesenvolvimento, atualizaCicloproducao, atualizaFlcor, atualizaFlMes, atualizaTipofruto, atualizaNatureza, atualizaFrcor, atualizaFrMes, atualizaTiposemeadura, atualizaSementeskg, atualizaArmazensemente, atualizaTmpgerminmin, atualizaTmpgerminmax, atualizaPercentgermin, atualizaViabilsemente);
    }
}
